package java_0708;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class CallableThread2 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for(int i=1;i<=1000;i++){
                    sum += i;
                }
                return sum;
            }
        };
        //当我们创建出这个futureTask实例的时候，此时Callable大概率还没算完的。
        //当后面Callable在线程中执行完了之后，此时会把这个结果给写入到FutureTask实例中。
        //此处的FutureTask的定位，其实就和刚才Runnable版本的代码中的那个result类是类似的
        //由于thread不能直接传一个callable实例，就需要一个辅助的类来包装一下
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        Thread t = new Thread(futureTask);
        t.start();
        //尝试在主线程获取结果
        //如果FutureTask中的结果还没有生成呢，此时就会阻塞等待
        //一直等到线程把这个结果算出来之后，get才会返回
        int result = futureTask.get();
        System.out.println(result);
    }
}
